Ana içeriğe geç

Değişkenler ve Değişebilirlik

Merhaba dünya programında da gördüğümüz üzere istediğimiz verileri değişkenler ile kaydedebilir ve sonrasında kullanabiliriz. Bu değişkenler ile ilgili bilmemiz gereken durum Rust dilinde başlangıç değeri olarak değişkenler değişmez olmaktadır. Bu kavram karışık gelebilir, adında var değişken olduğu nasıl başlangıçta değişmiyor! Bu durumun bir açıklaması mevcut. Programlama dilleri türkçeleştirilirken varable kavramı türkçe anlamı olan değişken şeklinde çevrilmiş. Ancak aslında tam bir karşılık değil. Çünkü sonradan tanıtılan Mutability yani değişebilirlik özelliği ile aynı kavram gibi gelmekte.

Aslında değişkenleri içerilerinde veri tutan kutular olarak düşünebiliriz. Değişkenlik ise bu kutuların ağızlarının kapalı veya açık olmasını belirtmekte. Rust dilinde başlangıç olarak tüm kutuların kapağı kapalı. Eğer bu kutuların içerisinde bir değişiklik yapmak istiyorsak bu kutuları açarak kullanmamız gerekmektedir.

ipucu

Peki neden kutular başlangıçta kapalı ki? Açık olsalar içerilerindekileri istediğimiz zaman değişebilsek fena mı olur? Aslında olur. Çünkü değişkenleri değişebilir bırakmak yani kutuları açık bırakmak bir güvenlik açığı. Her nasıl biz o değişkenleri, kutuları istediğimiz gibi doldurup boşaltabiliyorsak kötü niyetli kişiler de bunu yapabilir. Rust gibi güvenliği merkezine alan bir dilde de bu kutuların başı boş bırakılması sıkıntılar yaşatabilir. Bu nedenle kutuların kapağı otomatik olarak kapatır.

Bir değişken değişmez özelliklere sahip olduğunda adeta verisine bağlanır ve değişiklik yapamayız. Bu durumu göstermek için bir örnek yapabiliriz.

İlk olarak cargo new X komudunu kullanabiliriz. Bu komut ve istediğimiz isim ile yeni bir Rust Projesi oluşturabiliriz.

cargo new degiskenler

Bu komudu çalıştırdığımızda degiskenler adlı bir dosya oluştuğunu ve bu klasör içerisinde proje oluştuğunu gözlemleyebiliriz. Bu klasörün içerisindeki src/main.rs dizinine ilerlediğimizde kodu yazacağımız alan karşımıza çıkar.

Karşımıza bir fonksiyon yapısı çıkmaktadır. Bu fonksiyonda bulunan println! yapısını kaldırabiliriz.

fn main() {

}

İlk olarak bir değişken oluşuturarak başlayabiliriz. Bu değişkeni oluştururken let anahtar kelimesini kullanabiliriz. Sonrasında değişkenin ismi ve = sonrasında değeri yer alacaktır.

let x = 5;

Sonrasında tanımladığımız bu değişkeni konsola yazdırabiliriz. Bu işlem için merhaba projesinde de görmüş olabileceğiniz üzere println!() makrosu kullanılacaktır. Bu makro ile ilgili ileriki kısımlarda yeni bilgiler vereceğiz.

println!("x'in değeri {} olmaktadır", x);

Yukarıdaki şekilde bir yapı oluşturabiliriz. Bu yapıda x süslü parantezlerin içerisine Rust tarafından yerleştirilecektir.

Artık kodumuz hazır. Bu kodu çalıştırmak için cargo build ve cargo run komutlarından yaralanabiliriz.

Kodumuzu terminalde çalıştırdığımızda x'in değeri 5 olmaktadır çıktısını aldığımızı görüntüleyebiliriz. Ancak fark edeceğiniz üzere birden fazla uyarı yani warning bulunmaktadır. Bu uyarılar kodun çalışmasına engel olmasada düzeltilmesi gerekmektedir. Şimdilik görmezden gelelim.

Peki bu x değerini 5'den farklı bir değer ile değiştirmek istesek mesela 6, nasıl bir sonuç ile karşılaşırız?

x = 6;

Kodu çalıştırmaya çalıştığımızda çalışmadığını görüntüleyebiliriz. Şu şekilde bir hata alacağız:

error[E0384]: cannot assign twice to immutable variable `x`
--> src/main.rs:4:5
|
2 | let x = 5;
| -
| |
| first assignment to `x`
| help: consider making this binding mutable: `mut x`
3 | println!("x'in değeri {} olmaktadır", x);
4 | x = 6;
| ^^^^^ cannot assign twice to immutable variable

For more information about this error, try `rustc --explain E0384`.
warning: `degiskenler` (bin "degiskenler") generated 1 warning
error: could not compile `degiskenler` due to previous error; 1 warning emitted

Gördüğünüz üzere Rust bizlere aynı zamanda compiler şeklinde de yardımcı olmaktadır. Bu hata kodunu hadi birlikte inceleyelim. İlk olarak 1. Satırda kodun hangi isme sahip olduğunu ifade etmektedir. Bu ismi direkt olarak internette de aratabiliriz. Sonrasında bizlere hatanın hangi dosyada ortaya çıktığını söylemektedir. İleriki kodlarda birden fazla dosya ile çalışacak olursak hatanın tam olarak hangi dosyada çıktığını bilmemiz bize kolaylık sağlayacaktır. Hemen altında kodumuzun bir parçası ifad edilmekte olunup kodun tam olarak nerede hata verdiği neden hata verdiği ifade edilmektedir. Son olarak da bu gata kodunu nasıl daha ayrıntılı inceleyebileceğimizi kod satırı ile ifade eden bir yapı bulunmaktadır.

Bu durumun nedeni let ile yalın bir şekilde tanımladığımız değişkenlerin otomatik olarak değişmez yani immutable halde olmasıdır. Eğer bu değişkenin değerini değişmek istiyorsak mutable bir tanımlama yapmamız gerekmektedir.

fn main() {

let mut x = 5;

println!("x'in değeri {} olmaktadır", x);

x = 6;

println!("x'in değeri {} olmaktadır", x);

}

Değişkenimizi mut anahtar kelimesi ile tanımladıktan sonra değiştirmek istediğimizde herhangi bir skıntı olmadan bu işlemi yapabildiğimizi görüntüleyebiliriz.

x'in değeri 5 olmaktadır

x'in değeri 6 olmaktadır

Sabitler

Sabitler de değişme özelliği olmayan değişkenlere denir. Ancak değişkenlerin aksine daha sert kurallara sahiplerdir. Örneğin kesinlikle mut anahtar kelimesini kabul etmezler. Sabitler yani constant veri tipleri const anahtar kelimesi ile tanımlanırlar.

ipucu

Sabitleri kutu örneğinde ifade etmek gerekirse bantlı kutular gibi düşünebiliriz. Ağzı kapalı kutular ne kadar güvenli olsa da bantlı koliler kadar güvenli değillerdir.

const SANIYELER: i8 = 60;

Sabitlere baktığımızda tanımlanırken bazı işlemlerin daha farklı olduğunu görüntüleyebiliriz. Bunları dört kısımda inceleyebiliriz:

  • Sabitlerin isimleri her zaman tamamı büyük harften oluşan şekilde tanımlanmaktadır.

  • Sabitler tanımlanırken her zaman türü eklenmelidir (i8). Bu konuda ilerde açıklamalar yapacağız.

  • Sabitler her zaman tanımlandığı anda bir değere atanmalıdır. Diğer değişkenler let x şeklinde boş oluşturulabilinirken sabitler her zaman bir değere atanmalıdır.

  • Sabitler fonksiyon gibi işlemlere direkt olarak tanımlanamaz.

Sonrasında bu sabiti diğer değişkenlere yaptığımız şekilde ekrana yazdırabiliriz.

const SANIYELER: i8 = 60;

println!("Saniyeler {} değerine eşit olmaktadır",SANIYELER);

Kodumuzu çalıştırdığımızda aynı değerin yazdırıldığı görülebilinir.

Ayrıca not olarak const değerleri yanlarına mut anahtar kelimesini değişken olmamalarından dolayı kabul etmemektedirler.

not

Sabitler tüm kod dosyaları içerisinde kullanılacak olan değerler için uygundur. Mesela bir oyunda yer alabilecek maksimum oyuncu sayısı, ışığın hızı veya round sayısı oyunun çalışması süresi boyunca değişmez. Bu değerleri sabitler ile depolamamız bizlere hız ve güvenlik sağlar.

Gölgelenme

Rust dili içerisinde bir değişken istenilen isimle oluşturulduktan sonra yeniden aynı isimle farklı değişken oluşturulabilir. Bu gibi durumlarda önceden tanımlanan değişken verisi gölgelenmiş olur. Bu durumu alt kısımda görüntüleyebiliriz.

fn main(){

let x = 5;

println!("x'in değeri {} olmaktadır", x);

let x = 6;

println!("x'in değeri {} olmaktadır", x);

}

Kodumuzu gördüğümüz şekilde tanımladığımızda herhangi bir sıkıntı olmadan çalıştığını ve alt kısımda bulunan çıktıyı ifade ettiğini görebiliriz.

x'in değeri 5 olmaktadır
x'in değeri 6 olmaktadır

Bu durumda 5 olarak tanımladığımız x değeri gölgelenerek yerine farklı bir değer gelmektedir.

Gölgelendirme yapmak değişkenleri değişebilir yapmaktan farklı olmaktadır. Çünkü eğer bir değişkeni gölgelerken tanım anahtar kelimesi olan let ifadesini kullanmazsak hata verecektir. Ancak sanki değerimiz değişebilir değişkenmiş gibi bazı işlemler yapabiliriz. Bu sayede tanımladığımız değer sadece kısa zamanlar için değişebilir özelliğine sahip olacaktır.

fn main() {
let x = 5;
let x = x + 1;
{
let x = x * 2;
println!("Parantez içerisindeki x değeri: {x}");
}
println!("x değeri: {x}");
}

Örneğin yukarıdaki kod yapısında x'i mut yaparak alt kısımlarındaki işlemleri let kullanmadan gerçekleştirebilirdik. Bunun yerine let kullanarak son işleme kadar x değerinin değişkenmiş gibi davranmasını ancak sonrasında değişmez özelliğe kavuşmasını sağladık. Kodumuzu çalıştırdığımızda şu şekilde bir sonuç alacağız:

Parantez içerisindeki x değeri: 12
x değeri: 6
uyarı

Değişebilir değişken yani mut anahtar kelimesini kullandığımız yapılar gölgelendirilemez. Eğer gölgelendirilmeye kalkılırsa hata verir.